package main

import (
	"io"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"time"

	"github.com/julienschmidt/httprouter"
)

// streamHandler 是 流处理器
func streamHandler(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
	// 获取请求的参数
	vid := p.ByName("vid-id")
	vl := VIDEP_DIR + vid

	video, err := os.Open(vl)
	if err != nil {
		log.Printf("读取文件失败，%v", err)
		sendErrorResponse(w, http.StatusInternalServerError, "服务器错误")
		return
	}

	// 设置这个响应头的类型，因为是视频，所以是 video/mp4
	// 那么在浏览器接收到这个数据后，发现 Content-Type 是视频流，就解析成视频来播放
	w.Header().Set("Content-Type", "video/mp4")

	// 设置响应内容体
	http.ServeContent(w, r, "", time.Now(), video)

	defer video.Close()
}

// uploadHandler 是 上传处理器
func uploadHandler(w http.ResponseWriter, r *http.Request, p httprouter.Params) {

	// 限制请求传入的参数的大小
	// 也就是把请求进行一个限制校验， 然后取出来赋值给 r.Body
	r.Body = http.MaxBytesReader(w, r.Body, MAX_UPLOAD_SIZE)

	// 判断数据是否超过了内存大小(这里定义的是 50M， 所以不能超过50M)
	if err := r.ParseMultipartForm(MAX_UPLOAD_SIZE); err != nil {
		sendErrorResponse(w, http.StatusBadRequest, "请求数据大小已超出限制！")
		return
	}

	file, _, err := r.FormFile("file") // 对应 from name="file"
	if err != nil {
		sendErrorResponse(w, http.StatusInternalServerError, "请求错误！")
		return
	}

	data, errFile := ioutil.ReadAll(file)
	if errFile != nil {
		log.Printf("读取文件失败，%v", errFile)
	}

	fn := p.ByName("vid-id")
	// 第一个参数：文件名称
	// 第二个参数：文件二进制数据
	// 第三个参数：写入的权限
	errFileWrite := ioutil.WriteFile(VIDEP_DIR+fn, data, 0666)
	if errFileWrite != nil {
		log.Printf("写入文件出错！%v", errFileWrite)
		sendErrorResponse(w, http.StatusInternalServerError, "请求错误!")
		return
	}

	w.WriteHeader(http.StatusCreated)
	io.WriteString(w, "文件上传成功！")

}
